/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.edu.unicen.twitter.suggest.backend.recommendation.Ranking;

import ar.edu.unicen.twitter.suggest.backend.recommendation.CompararUsuarios.CompararPorScoreExterno;
import ar.edu.unicen.twitter.suggest.backend.recommendation.Ranking.combinar.CombinadorPuntaje;
import ar.edu.unicen.twitter.suggest.backend.recommendation.Ranking.combinar.CombinadorPuntajeProducto;
import ar.edu.unicen.twitter.suggest.commons.dtos.Usuario;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @author Alex
 */
public class RankingUsuariosCompuestoLineal implements RankingUsuarios{

    //RankingUsuarios ranking1;
   // RankingUsuarios ranking2;
    int limite1, limite2;
    int rango;

    public RankingUsuariosCompuestoLineal(/*RankingUsuarios ranking1,RankingUsuarios ranking2, */int limite1, int limite2){
       /* this.ranking1 = ranking1;
        this.ranking2 = ranking2;*/
        this.limite1 = limite1;
        this.limite2 = limite2;
        if(this.limite2==this.limite1)
            this.limite2++;
        this.rango = limite2-limite1;
    }
    
    @Override
    public Map<Usuario, Double> rank(List<Usuario> usuarios) {
        Map<Usuario, Double> scores1 = new HashMap<Usuario, Double>(usuarios.size());
        // Map<Usuario, Double> scores1 = ranking1.rank(usuarios);
        //Map<Usuario, Double> scores2 = ranking2.rank(usuarios);
        
        CombinadorPuntaje combinador = new CombinadorPuntajeProducto();
        double max = 0.0;
        for(Usuario usuario:usuarios){
            Double score = combinador.combinar(usuario.getScore(), usuario.getMentions());//scores1.get(usuario);
            scores1.put(usuario,score);
            max = Math.max(max, score);
        }
        Collections.sort(usuarios,new CompararPorScoreExterno(scores1));
        
        double s1limite=1.0;
        for(int p = 0; p<usuarios.size();++p){
            
            Usuario usuario=usuarios.get(p);
            double s1 = scores1.get(usuario)/max;        
            double s2 = usuario.getScore();
            double score=0.0;
            if(p<limite1){
                score = s1;
                s1limite = s1;
            }
//            else if (limite1<=p && p<limite2)
//                score = s1*(((double)limite2-p))/rango+s2*s1limite*(((double)p-limite1))/rango;
            else
                score = s2*s1limite;

            scores1.put(usuario,score);
        }
        return scores1;
    }
}
